Что такое указатели?
Определение указателя
Указатель — это переменная, которая хранит адрес другой переменной в памяти компьютера.
int number = 42; // Обычная переменная
int *ptr = &number; // Указатель на переменную number
Как это работает
Переменные в памяти
#include <stdio.h>
int main() {
int age = 25;
printf("Значение переменной age: %d\n", age);
printf("Адрес переменной age: %p\n", &age);
return 0;
}
Результат:
Значение переменной age: 25
Адрес переменной age: 0x7fff5fbff6ac
Указатель хранит адрес
- Основной пример
- Аналогия
#include <stdio.h>
int main() {
int score = 100;
int *scorePtr = &score; // Указатель хранит адрес score
printf("=== ЧТО ХРАНИТСЯ ГДЕ ===\n");
printf("score хранит значение: %d\n", score);
printf("scorePtr хранит адрес: %p\n", scorePtr);
printf("По адресу находится: %d\n", *scorePtr);
return 0;
}
// Аналогия с домом:
// int house = 42; // Дом содержит жильца (число 42)
// int *address = &house; // Адрес дома (указатель)
int value = 15; // "Жилец" в памяти
int *address = &value; // "Адрес дома" где живет жилец
printf("В доме по адресу %p живет: %d\n", address, *address);
Два основных оператора
Оператор адреса (&)
Получает адрес переменной в памяти.
int temperature = 36;
printf("Адрес temperature: %p\n", &temperature);
Оператор разыменования (*)
Получает значение по адресу, на который указывает указатель.
int height = 180;
int *ptr = &height;
printf("Указатель ptr хранит: %p\n", ptr); // Адрес
printf("По этому адресу: %d\n", *ptr); // Значение
Объявление указателей
Синтаксис
тип *имя_указателя;
Примеры объявления
int *integerPointer; // Указатель на int
float *floatPointer; // Указатель на float
char *characterPointer; // Указатель на char
Простой практический пример
#include <stdio.h>
int main() {
// Создаем переменную
int money = 500;
// Создаем указатель на эту переменную
int *wallet = &money;
printf("В кошельке: %d рублей\n", money);
printf("Кошелек находится по адресу: %p\n", wallet);
printf("В кошельке по этому адресу: %d рублей\n", *wallet);
// Тратим деньги через указатель
*wallet -= 100;
printf("После траты через указатель:\n");
printf("В кошельке осталось: %d рублей\n", money);
return 0;
}
Зачем нужны указатели
- Эффективность — передача адреса вместо копирования больших данных
- Изменение переменных — функции могут изменять переменные вызывающего кода
- Динамическая память — создание структур данных переменного размера
- Работа с массивами — эффективный доступ к элементам
Пример с функцией scanf()
#include <stdio.h>
int main() {
int userAge;
printf("Введите возраст: ");
scanf("%d", &userAge); // Передаем АДРЕС переменной
printf("Ваш возраст: %d\n", userAge);
// scanf() получила адрес и записала значение прямо
// в переменную userAge
return 0;
}
Указатель — это просто переменная, которая "показывает" на другую переменную, храня её адрес в памяти.